package chapter003;

/**
 *  这个是文档注释, 对类/方法/常量等的说明
 *  JavaSE 第三章
 *  基本数据类型讲解
 *
 * @author Jack魏
 */
public class Point02 {
    /**
     * 程序执行入口
     */
    public static void main(String[] args) {
        dateType();
    }

    // 类变量不需要初始化值, 在加载类时会填充默认值
    boolean defaltBoolean;
    /**
     * Java里面的变量需要申请内存进行存储的, 和C/C++一样
     * 每个类型的变量所需的内存不一样, 所有导致存储的大小和能力不同
     * Java 分为两大数据类型(这里我们先讨论基本数据类型)
     *       1.基本数据类型
     *       2.引用数据类型
     */
    public static void dateType(){
        /**
         *  byte
         *  8位二进制
         *  最小值是 -128（-2^7）
         *  最大值是 127（2^7-1）
         *  默认值是 0
         */
        System.out.println("基本类型：byte 二进制位数：" + Byte.SIZE);
        System.out.println("包装类：java.lang.Byte");
        System.out.println("最小值：Byte.MIN_VALUE=" + Byte.MIN_VALUE);
        System.out.println("最大值：Byte.MAX_VALUE=" + Byte.MAX_VALUE);
        System.out.println();

        /**
         * short
         * 16 位二进制
         * 最小值是 -32768（-2^15）
         * 最大值是 32767（2^15 - 1）
         * 默认值是 0
         */
        System.out.println("基本类型：short 二进制位数：" + Short.SIZE);
        System.out.println("包装类：java.lang.Short");
        System.out.println("最小值：Short.MIN_VALUE=" + Short.MIN_VALUE);
        System.out.println("最大值：Short.MAX_VALUE=" + Short.MAX_VALUE);
        System.out.println();

        /**
         * int
         * 32 位二进制
         * 最小值是 -2,147,483,648（-2^31）
         * 最大值是 2,147,483,647（2^31 - 1）
         * 默认值是 0
         */
        System.out.println("基本类型：int 二进制位数：" + Integer.SIZE);
        System.out.println("包装类：java.lang.Integer");
        System.out.println("最小值：Integer.MIN_VALUE=" + Integer.MIN_VALUE);
        System.out.println("最大值：Integer.MAX_VALUE=" + Integer.MAX_VALUE);
        System.out.println();

        /**
         * long
         * 64 位二进制
         * 最小值是 -9,223,372,036,854,775,808（-2^63）
         * 最大值是 9,223,372,036,854,775,807（2^63 -1）
         * 默认值是 0L
         */
        System.out.println("基本类型：long 二进制位数：" + Long.SIZE);
        System.out.println("包装类：java.lang.Long");
        System.out.println("最小值：Long.MIN_VALUE=" + Long.MIN_VALUE);
        System.out.println("最大值：Long.MAX_VALUE=" + Long.MAX_VALUE);
        System.out.println();

        /**
         * float
         * 32 位二进制
         * 默认值是 0.0f
         */
        System.out.println("基本类型：float 二进制位数：" + Float.SIZE);
        System.out.println("包装类：java.lang.Float");
        System.out.println("最小值：Float.MIN_VALUE=" + Float.MIN_VALUE);
        System.out.println("最大值：Float.MAX_VALUE=" + Float.MAX_VALUE);
        System.out.println();

        /**
         * double
         * 64 位二进制
         * 默认值是 0.0
         */
        System.out.println("基本类型：double 二进制位数：" + Double.SIZE);
        System.out.println("包装类：java.lang.Double");
        System.out.println("最小值：Double.MIN_VALUE=" + Double.MIN_VALUE);
        System.out.println("最大值：Double.MAX_VALUE=" + Double.MAX_VALUE);
        System.out.println();

        /**
         * boolean
         * 1 位二进制
         * 默认值是 false
         */
        // 方法里面的变量必须初始化值分配空间, 不然编译器无法通过
        boolean defaltBoolean = false;
        System.out.println("基本类型：boolean 默认值 : " + defaltBoolean);

        /**
         * char
         * 16 位 Unicode 字符(可以是中文)
         * Java采用的就是Unicode编码 也就是说变量名可以是中文 但是没人这么做
         * 最小值是 \u0000（即为0）
         * 最大值是 \uffff（即为65,535）
         */
        System.out.println("基本类型：char 二进制位数：" + Character.SIZE);
        System.out.println("包装类：java.lang.Character");
        // 以数值形式而不是字符形式将Character.MIN_VALUE输出到控制台
        System.out.println("最小值：Character.MIN_VALUE=" + (int) Character.MIN_VALUE);
        // 以数值形式而不是字符形式将Character.MAX_VALUE输出到控制台
        System.out.println("最大值：Character.MAX_VALUE=" + (int) Character.MAX_VALUE);
    }

    /**
     * 包装类的使用介绍
     * 参考链接: https://www.cnblogs.com/lyq-biu/p/10778109.html
     */
    public static void packaging(){
        //1.自动装箱
        int t1=1;
        Integer t2=t1;
        //2.手动装箱
        Integer t3=new Integer(t1);
        System.out.println("int类型t1="+t1);
        System.out.println("自动装箱，Integer类型对象t2="+t2);
        System.out.println("手动装箱，Integer类型t3="+t3);

        //1.自动拆箱
        int t4=t2;
        //2.手动拆箱
        //通过intValue()方法返回int值，还可以利用其他方法装换为其他类型
        int t5=t2.intValue();
        System.out.println("自动拆箱,int型t4="+t4);
        System.out.println("手动拆箱,int型t5="+t5);

        //基本数据类型转换为字符串
        String str=Integer.toString(t1);
        System.out.println("int转换为String："+str);
        //字符串转换为基本数据类型
        //通过paerInt方法
        int it=Integer.parseInt(str);
        //通过valeOf,先把字符串转换为包装类然后通过自动拆箱
        int it1=Integer.valueOf(str);



        Integer one=new Integer(100);
        Integer two=new Integer(100);
        //one和对two是两个不同的对象，==在比较对象时比较的是内存地址，两个是不同的空间，放的值相同
        System.out.println("one==two:"+(one==two));
        Integer three=100;//自动装箱
        /* Integer three=Integer.valueOf(100);
         * 这时缓存区没有，就会构造一个
         */
        System.out.println("three==100:"+(three==100));//自动拆箱
        Integer four=100;
        /*实际执行的是    Integer four=Integer.valueOf(100); 这时缓存区有，就会直接取
         * Java为了提高拆装箱效率，在执行过程中提供了一个缓存区（对象池）【类似于常量数组】，
         * 如果传入的参数是，-128<参数<127会直接去缓存查找数据，如果有久直接产生，如果没有就隐式调用new方法产生
         */
        System.out.println("three==four:"+(three==four));
        Integer five=200;
        System.out.println("five==200:"+(five==200));
        Integer six=200;
        //注：这里为200，超出了缓存区范围，所以都需要构建
        System.out.println("five==six:"+(five==six));
        /*
         * 输出：
         *     one==two:false
            three==100:true
            three==four:true
            five==200:true
            five==six:false
         */
    }

}
